Java连接Sftp判断文件是否存在,ls、stat、lstat区别

您所在的位置:网站首页 sftp用法 cd Java连接Sftp判断文件是否存在,ls、stat、lstat区别

Java连接Sftp判断文件是否存在,ls、stat、lstat区别

#Java连接Sftp判断文件是否存在,ls、stat、lstat区别| 来源: 网络整理| 查看: 265

一、问题背景

目前开发某个功能需求时,需要校验sftp中文件是否存在,而不需读取其内容。 公司现有sftp功能代码都为获取文件数据并落库或其他处理。 而我这个功能只需要校验是否存在,不想使用现有方式拉取判断是否存在,拉取文件必然会有成本。

二、解决思路

stackover回答:使用 JSch,有没有办法判断远程文件是否存在,而无需执行ls并循环遍历文件以查找名称匹配?

ls:查看目录下文件信息stat:stat方法确实遵循符号链接(即返回链接的属性而不是目标)lstat:lstat方法不遵循符号链接(即返回目标的属性而不是链接) 例如,您有一个符号链接’myhome’,它实际上是/ u02/home/alamba的快捷方式。 使用lstat,您将获得链接目标的属性’/ u02/home/alamba’文件夹。使用统计信息,您将获得“myhome”链接的属性。

还是不太清楚stat和lstat的区别。网上只找到了以上信息。 不过大致思路就是通过获取文件信息判断是否存在,获取失败都是抛出异常,自行处理即可。

三、最终解决 连接sftp获取对象。调用其lstat方法传入文件全路径。抛出异常说明获取不到,正常返回文件信息。其他方式,只需将sftp.lstat换为.stat或.ls即可。 public boolean isExistSftp(String filePach){ boolean result = false; Session session = null; Channel channel = null; ChannelSftp sftp = null; try { JSch jsch = new JSch(); session = jsch.getSession(apolo.getSftpUserName(),apolo.getSftpIp(), apolo.getSftpPort()); session.setPassword(apolo.getSftpPassWord()); session.setTimeout(60000); Properties config = new Properties(); config.put("StrictHostKeyChecking", "no"); session.setConfig(config); session.connect(); channel = session.openChannel("sftp"); channel.connect(); sftp = (ChannelSftp) channel; SftpATTRS lstat = sftp.lstat(filePach); result = true; } catch (JSchException e) { log.error("连接SFTP失败,IP:{},端口:{},用户名:{},密码:{}", apolo.getSftpIp(),apolo.getSftpPort(),apolo.getSftpUserName(),apolo.getSftpPassWord().substring(0,3),e); } catch (SftpException e) { log.error("sftp文件下载失败,找不到对应文件",e); } catch (Exception e){ log.error("Sftp连接获取文件信息出现未知异常",e); }finally { if (sftp != null)sftp.quit(); if (channel != null)channel.disconnect(); if (session != null)session.disconnect(); } return result; } 四、遗留问题

该方法为接口调用,请求量较大时,与sftp频繁建立连接势必会造成性能、通讯损耗。

甲方封装代码

在这里插入图片描述 个人浅显理解:

bean为单例,整个jvm只有一个对象共用。按照目前的写法,系统启动或使用时初始化建立与ftp的链接。每次使用时只调用其下载或上传等方法,不能调用关闭。但目前了解到功能开发为方法内注入该bean,先调用connect创建链接,之后下载,最后close关闭。多线程环境下,很大可能会造成A线程关闭了B新建的链接会话。相当于俩线程同时操作bean内的成员变量。 五、附ftp连接

该部分引入:https://www.ktanx.com/blog/p/4028

减少依赖,使用JDK自带的ftp客户端sun.net.ftp.FtpClient FtpClient ftpClient = new FtpClient(); ftpClient.openServer(FTP_IP, FTP_PORT); ftpClient.login(LOGIN_NAME, PASSWORD); ftpClient.binary(); TelnetInputStream is = ftpClient.get("/ftp/re/20140713.dat"); BufferedReader reader = new BufferedReader(new InputStreamReader(is)); apache的commons-net FtpClient ftpClient = new FtpClient(); ftpClient.connect(FTP_IP, FTP_PORT); ftpClient.login(LOGIN_NAME, PASSWORD); // 中文支持 ftpClient.setControlEncoding("UTF-8"); ftpClient.setFileType(FTPClient.BINARY_FILE_TYPE); ftpClient.enterLocalPassiveMode(); InputStream is = ftpClient.retrieveFileStream("/ftp/re/20140713.dat"); BufferedReader reader = new BufferedReader(new InputStreamReader(is)); sftp ChannelSftp sftp = null; JSch jsch = new JSch(); Session sshSession = jsch.getSession(LOGIN_NAME, FTP_IP, FTP_PORT); sshSession.setPassword(PASSWORD); sshSession.setConfig("StrictHostKeyChecking", "no"); sshSession.connect(); Channel channel = sshSession.openChannel("sftp"); channel.connect(); sftp = (ChannelSftp) channel; InputStream is = sftp.get("/ftp/re/20140713.dat"); BufferedReader reader = new BufferedReader(new InputStreamReader(is));


【本文地址】


今日新闻


推荐新闻


CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3